package com.eric.service.impl;
import cn.dev33.satoken.secure.BCrypt;
import com.eric.dao.UserDao;
import com.eric.dao.User_RolesDao;
import com.eric.entity.User;
import com.eric.entity.User_Roles;
import com.eric.result.Code;
import com.eric.result.Result;
import com.eric.service.GetUserInfoService;
import com.eric.service.UserInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Map;

@Service
public class UserInfoServiceImpl implements UserInfoService {
    @Autowired
    private UserDao userDao;
    @Autowired
    private GetUserInfoService getUserInfoService;
    @Autowired
    private User_RolesDao userRolesDao;

    @Override
    public void saveOneUserService(User user) {
        User searchLoginName = getUserInfoService.getONeByNameService(user.getLoginname());
        if (searchLoginName==null){
            userDao.SaveOne(user);
            User allByUserName = userDao.getAllByUserName(user.getLoginname());
//            System.out.println(allByUserName);

            User_Roles userRoles=new User_Roles();
            userRoles.setUser_id(allByUserName.getId());
            userRoles.setRole_id(5);
            System.out.println(userRoles);

            userRolesDao.saveOneUserRole(userRoles);
        }
    }

    @Override
//    方法启用事务
    @Transactional
    public Result modifyOneUserService(Map<String,Object> userMap) {

//        定义userMap的key
        String loginname="loginname";
        String password="password";
        String realname="realname";
        String user_id="user_id";
        String role_id="role_id";
//        获取User中的id
        Object user_id_obj = userMap.get(user_id);
//        判断传进来的user_id对象是否为null和是否可以转换成数字
//        如果user_id对象不为空和user_id可以转换为数字
        if (user_id_obj!=null&&user_id_obj.toString().chars().allMatch(Character::isDigit)){
            int userId = Integer.parseInt(user_id_obj.toString().replaceAll("\\s",""));
            String userLoginName = userMap.get(loginname).toString().trim();
//            通过loginname获取到User对象，如果对象为空，返回，不为空，接着下一步
            User userInDb = userDao.getAllByUserName(userLoginName);
            System.out.println(userInDb);



            if (userInDb==null){
                return new Result(Code.PUT_ERR,"数据库中没有该用户,无法修改！");
            }
            else {
                //            获取前端传来的密码
                String userPassword = userMap.get(password).toString().trim();
                String hashpw;
//            通过数据库中存储的密码和传进来的密码是否匹配，如果不匹配，就把新密码
//            通过BCrypt.checkpw（“传进来的参数”，“数据库中参数”）判定，如果是false
//            意味着password已经更改，需要把前端传来的密码写进数据库中，否则就不修改，用null
                if (!BCrypt.checkpw(userPassword,userInDb.getPassword())){
                    hashpw = BCrypt.hashpw(userPassword);
                }else {
                    hashpw = null;
                }
//            创建来的realname去掉两头多余空字符
                String userRealname = userMap.get(realname).toString().trim();
//            获取前端传来的roleId
                int roleId = Integer.parseInt(userMap.get(role_id).toString());
//            这里把role_id永远设定为4,normal用户，要修改用户权限，需要用admin,superadmin权限才可以修改，用专门接口实现
                userRolesDao.modifyUserRole(4,userId);
                userDao.modifyOne(hashpw,userRealname,userId);

                return new Result(Code.PUT_OK,"succeed");
            }

        }
        else {
            return new  Result(Code.PUT_ERR,"传进来得user_id参数有误");
        }

    }

    @Override
    @Transactional

    //    修改用户权限方法
    public Result modifyOneRoleService(Integer userId, Integer role_id) {

        if (userId==null||role_id==null){
            return new Result(Code.PUT_ERR,"输入参数有误，请重新输入！");
        }else {
            Integer i = userRolesDao.modifyOneRole(userId, role_id);
            System.out.println(i);
            return new Result(Code.PUT_OK,"修改成功！");
        }

    }






}
